﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using BussinessLogicTecnoPez.Seguridad_Tecnopez;
using System.Text;
using Tecnopez.Globals;

public partial class Controls_Menu : System.Web.UI.UserControl
{
    private StringBuilder scriptMenu;
    private string PATH_THEME_MENU = "Styles/ThemeOffice/";
    private Usuario objUser;
    private string keyApplication;
    private Hashtable objHashPermision;

    protected void Page_Load(object sender, EventArgs e)
    {
        setUserLogued();

        StringBuilder strMenu;
        strMenu = (StringBuilder)Application[keyApplication];

        if (strMenu == null || strMenu.ToString() == string.Empty)
        {
            this.crearMenu();
        }
        string scripts = "";
        scripts = "<script type=\"text/javascript\">var cmThemeOfficeBase =\"" + Functions.getHost(this.Page) + "Styles/ThemeOffice/\"</script>";
        scripts = scripts + "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + Functions.getHost(this.Page) + "Styles/theme.css\" />";
        scripts = scripts + "<script type=\"text/javascript\" src=\"" + Functions.getHost(this.Page) + "JavaScript/JSCookMenu.js\"></script>";
        scripts = scripts + "<script type=\"text/javascript\" src=\"" + Functions.getHost(this.Page) + "JavaScript/menu.js\"></script>";
        this.Page.ClientScript.RegisterClientScriptBlock(typeof(string), "js", scripts);

        Session["mnuId"] = keyApplication;
    }

    /// <summary>
    /// Crea un objeto usuario con el usuario logueado
    /// </summary>
    private void setUserLogued()
    {
        if (Session["mnuId"] == null || Session["mnuId"].ToString() == string.Empty)
        {
            string user = Page.User.Identity.Name;
            Usuario.getManager.ClearFilters();
            Usuario.getManager.AddFilter("NOMBRE", BussinessLogicTecnoPez.GenericManager<Usuario>.filterOperator.Equals, user);
            objUser = Usuario.getManager.GetOne();

            if (objUser != null)
                keyApplication = "MENU_" + objUser.Rol.Nombre.Trim();
            else
                keyApplication = "";
        }
        else
        {
            keyApplication = Session["mnuId"].ToString();
        }
    }

    /// <summary>
    /// Crea el script del menu
    /// </summary>
    private void crearMenu()
    {
        List<FuncionTecnopez> objFunciones;
        List<FuncionTecnopez> objFuncionesPadres;
        List<FuncionTecnopez> objFuncionesHijas;

        objHashPermision = new Hashtable();

        if (objUser == null)
        {
            Application[keyApplication] = scriptMenu;
            Application[keyApplication + "_HASH"] = objHashPermision;
            Session["KEY_HASH"] = keyApplication + "_HASH";
            return;
        }

        objFunciones = getFunctions(objUser.Rol.Permisos.ItemList);

        if (objFunciones != null && objFunciones.Count == 0)
            return;

        objFuncionesPadres = objFunciones.FindAll(EsPadre);

        if (objFuncionesPadres.Count <= 0)
        {
            return;
        }

        //inicio de la variable del menu
        scriptMenu = new StringBuilder();
        scriptMenu.Append(@"<div id=""myMenuID""></div>");
        scriptMenu.Append(@"<script language=""JavaScript"" type=""text/javascript"">");
        scriptMenu.Append("var myMenu =");
        scriptMenu.Append("[");

        for (int i = 0; i < objFuncionesPadres.Count; i++)
        {
            objFuncionesHijas = GetHijos(objFunciones, objFuncionesPadres[i]);
            if (objFuncionesHijas.Count > 0)
            {
                //si el padre tiene hijos los agrego
                scriptMenu.Append(this.AgregarItem(objFuncionesPadres[i], false) + ",");
                this.CrearHijos(objFuncionesHijas, objFunciones);
                scriptMenu.Append("]");
            }
            else
            {
                scriptMenu.Append(this.AgregarItem(objFuncionesPadres[i], true));
            }
            if (i != objFuncionesPadres.Count - 1)
                scriptMenu.Append(",");
        }

        //fin de la variable del menu
        scriptMenu.Append("];\n");
        //esto es para que lo dibuje
        scriptMenu.Append("cmDraw ('myMenuID', myMenu, 'hbr', cmThemeOffice, 'ThemeOffice');");
        scriptMenu.Append("</script>");

        Application[keyApplication] = scriptMenu;
        Application[keyApplication + "_HASH"] = objHashPermision;
        Session["KEY_HASH"] = keyApplication + "_HASH";
    }

    /// <summary>
    /// Retorna un List de funciones de tecnopez
    /// </summary>
    /// <param name="objArray">Array de funciones de tecnopez</param>
    /// <returns>List de funciones de tecnopez</returns>
    private List<FuncionTecnopez> getFunctions(ArrayList objArray)
    {
        List<FuncionTecnopez> objList = new List<FuncionTecnopez>();
        foreach (FuncionRol objFuncion in objArray)
        {
            FuncionTecnopez.getManager.ClearFilters();
            FuncionTecnopez.getManager.AddFilter("IdFuncionTecnopez", BussinessLogicTecnoPez.GenericManager<FuncionTecnopez>.filterOperator.Equals, objFuncion.FuncionTecnopez.IdFuncionTecnopez);
            objList.Add(FuncionTecnopez.getManager.GetOne());
        }
        return getListOrder(objList);
    }

    /// <summary>
    /// Ordena alfabeticamente los permisos del usuario logueado
    /// </summary>
    /// <param name="objList">List genérica que posee los permisos</param>
    /// <returns>List genérica ordenada alfabeticamente</returns>
    private List<FuncionTecnopez> getListOrder(List<FuncionTecnopez> objList)
    {
        FuncionTecnopez objAux;

        for (int i = 0; i < objList.Count-1; i++)
        {
            for (int j = i + 1; j < objList.Count; j++)
            {
                if (objList[i].Nombre.CompareTo(objList[j].Nombre) > 0)
                {
                    objAux = objList[i];
                    objList[i] = objList[j];
                    objList[j] = objAux;
                }
            }
        }
        return objList;
    }

    /// <summary>
    /// Devuelve las funciones que son padres
    /// </summary>
    /// <param name="objFuncion"></param>
    /// <returns></returns>
    private static bool EsPadre(FuncionTecnopez objFuncion)
    {
        if (objFuncion.FuncionPadre == null)
            return true;
        else
            return false;
    }

    /// <summary>
    /// Devuelve las funciones tecnopez que dependen de un padre
    /// </summary>
    /// <param name="objLista">Lista con los objetos funciones tecnopez</param>
    /// <param name="objFuncion">Objeto padre</param>
    /// <returns></returns>
    private List<FuncionTecnopez> GetHijos(List<FuncionTecnopez> objLista, FuncionTecnopez objFuncion)
    {
        List<FuncionTecnopez> lista=new List<FuncionTecnopez>();

        for (int i=0; i<objLista.Count; i++)
        {
            if (objLista[i].FuncionPadre != null && objLista[i].FuncionPadre.IdFuncionTecnopez == objFuncion.IdFuncionTecnopez)
            {
                lista.Add(objLista[i]);
            }
        }
        return lista;
    }

    /// <summary>
    /// Agrega al string del script el item del menu
    /// </summary>
    /// <param name="objFuncion">Objeto del cual obtiene los datos para agregar el item</param>
    /// <param name="agregaCorcheteFinal">True si es una hoja del arbol, False si posee hijos</param>
    /// <returns></returns>
    private string AgregarItem(FuncionTecnopez objFuncion,bool agregaCorcheteFinal)
    {
        string titulo;
        string icono;
        string url;
        string destino="null";
        string descripcion;

        if (objFuncion.Nombre.Trim() != string.Empty)
            titulo = "'" + objFuncion.Nombre.Trim() + "'";
        else
            titulo = "null";

        if (objFuncion.ImageUrl!=null && objFuncion.ImageUrl.Trim() != string.Empty)
            icono = "'<img src=\"" + Functions.getHost(Page) + PATH_THEME_MENU + objFuncion.ImageUrl.Trim() + "\"/>'";
        else
            icono="null";

        if (objFuncion.URL!=null && objFuncion.URL.Trim() != string.Empty)
            url = "'" + Functions.getHost(Page) + objFuncion.URL.Trim() + "'";
        else
            url = "null";

        if (objFuncion.Descripcion!=null && objFuncion.Descripcion.Trim() != string.Empty)
            descripcion = "'" + objFuncion.Descripcion.Trim() + "'";
        else
            descripcion = "null";

        if (url != "null")
            objHashPermision.Add(url.Replace("'", "").ToUpper(), url);

        if (agregaCorcheteFinal == true)
            return "[" + icono + ", " + titulo +", " + url + ", " + destino + ", " + descripcion + "]";
        else
            return "[" + icono + ", " + titulo + ", " + url + ", " + destino + ", " + descripcion;
    }

    /// <summary>
    /// Agrega los items hijos de un menu padre
    /// </summary>
    /// <param name="objFunciones">Lista de items hijos</param>
    /// <param name="objFuncionesAll">Lista de todas las funciones</param>
    private void CrearHijos(List<FuncionTecnopez> objFunciones, List<FuncionTecnopez> objFuncionesAll)
    {
        List<FuncionTecnopez> objFuncionesHijas;

        for (int i = 0; i < objFunciones.Count; i++)
        {
            objFuncionesHijas = GetHijos(objFuncionesAll, objFunciones[i]);
            if (objFuncionesHijas.Count > 0)
            {
                //si el padre tiene hijos los agrego
                scriptMenu.Append(this.AgregarItem(objFunciones[i], false) + ",");
                this.CrearHijos(objFuncionesHijas, objFuncionesAll);
                scriptMenu.Append("]");
            }
            else
            {
                scriptMenu.Append(this.AgregarItem(objFunciones[i], true));
            }
            if (i != objFunciones.Count - 1)
                scriptMenu.Append(",");
        }
    }
}
